home *** CD-ROM | disk | FTP | other *** search
- /*
- File: DynamicArray.cp
-
- Contains: A handle-based dynamic array class
-
- Written by: Dave Falkenburg
-
- Copyright: © 1994-95 by Dave Falkenburg, all rights reserved.
-
- Change History (most recent first):
-
- <1> 1/3/95 DRF First checked in.
- */
-
- #include "DynamicArray.h"
- #include <Memory.h>
-
- TDynamicArray::TDynamicArray()
- {
- fElementCount = 0;
- fStorage = (ArrayElementPtr **) NewHandle(0);
- }
-
-
- TDynamicArray::~TDynamicArray()
- {
- DisposeHandle((Handle) fStorage);
- }
-
-
- OSErr
- TDynamicArray::InsertFirst(ArrayElement * elementToInsert)
- {
- return this->Insert(elementToInsert,0);
- }
-
-
- OSErr
- TDynamicArray::InsertLast(ArrayElement * elementToInsert)
- {
- return this->Insert(elementToInsert,fElementCount);
- }
-
-
-
-
- OSErr
- TDynamicArray::Insert(ArrayElement * elementToInsert, ArrayElementIndex beforeElement)
- {
- OSErr err;
-
- // make room for one more ArrayElementPtr
- SetHandleSize((Handle) fStorage, fElementCount*sizeof(ArrayElementPtr) + sizeof(ArrayElementPtr));
- if ((err = MemError()) != noErr)
- return err;
-
- // slide remaining elements down
-
- if (fElementCount)
- {
- BlockMoveData( &((*fStorage)[beforeElement]),
- &((*fStorage)[beforeElement+1]),
- (fElementCount - beforeElement) * sizeof(ArrayElementPtr));
- }
-
- fElementCount++;
- (*fStorage)[beforeElement] = elementToInsert;
-
- return noErr;
- }
-
-
-
- OSErr
- TDynamicArray::Delete(ArrayElementPtr elementToDelete)
- {
- ArrayElementIndex index;
-
- for (index=0; index < fElementCount; index++)
- {
- if (elementToDelete == (*fStorage)[index])
- return this->DeleteElementGivenIndex(index);
- }
-
- return -1;
- }
-
-
- OSErr
- TDynamicArray::DeleteFirst()
- {
- return this->DeleteElementGivenIndex(0);
- }
-
-
- OSErr
- TDynamicArray::DeleteLast()
- {
- return this->DeleteElementGivenIndex(fElementCount-1);
- }
-
-
- OSErr
- TDynamicArray::DeleteElementGivenIndex(ArrayElementIndex whichElement)
- {
- if (whichElement > fElementCount)
- return -1;
-
- // CHECK THE MATH, DAVE!
-
- if (fElementCount)
- {
- // slide remaining elements up
-
- BlockMoveData( &((*fStorage)[whichElement+1]),
- &((*fStorage)[whichElement]),
- (fElementCount - whichElement) * sizeof(ArrayElementPtr));
-
- // cut back the storage
- fElementCount--;
- SetHandleSize((Handle) fStorage,fElementCount*sizeof(ArrayElementPtr));
-
- return noErr;
- }
- else
- return -1;
- }
-
-
- OSErr
- TDynamicArray::MoveToFront(ArrayElementPtr elementToMove)
- {
- ArrayElementIndex index;
-
- for (index=0; index < fElementCount; index++)
- {
- if (elementToMove == (*fStorage)[index])
- {
- if (index != 0)
- {
- BlockMove(&(*fStorage)[0],&(*fStorage)[1],index*sizeof(ArrayElementPtr));
- (*fStorage)[0] = elementToMove;
- }
- return 0;
- }
- }
-
- return -1;
- }
-
-
- void
- TDynamicArray::ForEachElement(EachArrayElementProc proc, void * param)
- {
- ArrayElementIndex index = 0;
-
- while (index < fElementCount)
- {
- (*proc)((*fStorage)[index],param);
- index++;
- }
- }
-
-
- ArrayElement *
- TDynamicArray::FirstElementThat(EachArrayElementTestProc proc, void * param)
- {
- ArrayElementIndex index = 0;
-
- while (index < fElementCount)
- {
- if ((*proc)((*fStorage)[index],param))
- return (*fStorage)[index];
- index++;
- }
-
- return NULL;
- }
-
-
- ArrayElement *
- TDynamicArray::LastElementThat(EachArrayElementTestProc proc, void * param)
- {
- ArrayElementIndex index = fElementCount-1;
-
- while (index != -1)
- {
- if ((*proc)((*fStorage)[index],param))
- return (*fStorage)[index];
- index--;
- }
-
- return NULL;
- }
-